package arr.数组的度;
//给定一个非空且只包含非负数的整数数组 nums，数组的度的定义是指数组里任一元素出现频数的最大值。
//
// 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组，返回其长度。
//
//
//
// 示例 1：
//
//
//输入：[1, 2, 2, 3, 1]
//输出：2
//解释：
//输入数组的度是2，因为元素1和2的出现频数最大，均为2.
//连续子数组里面拥有相同度的有如下所示:
//[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
//最短连续子数组[2, 2]的长度为2，所以返回2.
//
//
// 示例 2：
//
//
//输入：[1,2,2,3,1,4,2]
//输出：6
//
//
//
//
// 提示：
//
//
// nums.length 在1到 50,000 区间范围内。
// nums[i] 是一个在 0 到 49,999 范围内的整数。
//
// Related Topics 数组
// 👍 326 👎 0


import java.util.HashMap;
import java.util.Map;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int findShortestSubArray(int[] nums) {
        //记录每个数字的度
        Map<Integer, Integer> degreeMap = new HashMap<>();
        //记录每个数字在数组中第一次出现的位置
        Map<Integer, Integer> first = new HashMap<>();
        int res = 0, maxDegree = 0;
        for (int i = 0; i < nums.length; ++i) {
            //如果A[i]在数组中第一次出现，要记录下他的位置
            if (!first.containsKey(nums[i]))
                first.put(nums[i], i);
            //目前数字的度（数组还没有遍历完，这个度并不是最终的）
            int degree = degreeMap.getOrDefault(nums[i], 0) + 1;
            degreeMap.put(nums[i], degree);
            //如果小于最大的度，直接跳过
            if (degree < maxDegree)
                continue;
            //求出距离
            int distance = i - first.get(nums[i]) + 1;
            //如果目前的度最大，直接更新距离
            if (degree > maxDegree) {
                maxDegree = degree;
                res = distance;
            } else if (degree == maxDegree) {
                //和之前出现的最大的度一样，只需要取距离比较小的即可。
                res = Math.min(res, distance);
            }
        }
        return res;
    }
}
//leetcode submit region end(Prohibit modification and deletion)
